#include "instructions.h"

/* PCB */
struct pcb  {
	int id ;   // 进程的id 
	char name[10]; // 进程的名字
	struct pcb* next;   // 指向下一个进程的指针
	int super;      // 优先级   
	int ntime;    // 总共需要运行的时间    
	int rtime;       // 已经运行的时间  
	char state;      // 进程的状态
	Instructions * instructions ;  // 进程的指令
	resources * resource ;  // 进程的资源申请
	deque<int> * pagetable = new deque<int>();  // 记录在内存中,保存的是虚拟地址
	deque<int>* swaptable = new deque<int>();  //  记录在交换区中,保存的虚拟地址
	int size = 0 ; // 记录在内存中页的数量
	int totalSize = 0; // 记录总共获得的页数量，主要用于设置分配物理页对应的虚拟页
	map <int, int> * mp = new map<int,int> ();  // 保存虚拟地址和物理地址的映射，就是页表 
};
typedef struct pcb PCB;


// PCB 队列
class pcbList
{
private:
queue<PCB*> *list ;
	
public:
	pcbList(int num);  // 初始化pcb队列
	~pcbList();
	PCB * getPCB();   // 从pcb队列中获得pcb块
	bool insertPCB(PCB* newPcb);  // 向pcb队列中插入pcb 块
	void freePCB(PCB* newPcb);  // 释放pcb 块的内存
};


pcbList::pcbList(int num)
{
	list = new queue<PCB*>();
	for(int i = 0 ; i < num ; i++){
		list->push(new PCB);
	}  
}


pcbList::~pcbList()
{
	while (!list->empty())
	{
		delete list->front();
		list->pop();
	}
	
}

// 从pcb 队列中获得pcb
PCB* pcbList::getPCB(){

	if(list->empty()){
		insertPCB(new PCB());
	}

	PCB * data = list->front();
	list->pop();
	return data ;
}

// 往pcb 队列中添加 pcb
bool pcbList::insertPCB(PCB * newPcb){

	this->freePCB(newPcb);

	list->push(newPcb);
	return true ;

}

// 释放pcb 资源
void pcbList::freePCB(PCB * newPcb){

	delete newPcb->pagetable;
	delete newPcb->instructions;
	delete newPcb->resource ;
	delete newPcb->swaptable;
	delete newPcb->mp; 
	newPcb->totalSize = 0;
	newPcb->size = 0;
	newPcb->next = NULL;
	return ;

}

